# 1. 闭包
## 1.1 条件
"""
1. 函数嵌套定义
2. 内层函数使用外层函数的局部变量
3. 外层函数的返回值是内层函数的函数名
"""

# def outer():
#     n = 10
#     def inner():
#         print(n)
#     return inner
# print(outer()) # <function outer.<locals>.inner at 0x00000210A5715800> 返回的是inner的函数的内存地址
#
# outer()() # 10
# ot = outer()
# ot() # 10
#
#
# ## 1.2 参数
# def outer1(m):
#     n = 10
#     def inner1():
#         print("sum :", m + n)
#     return inner1
# outer1(30)() # sum : 40


## 1.3 每次开启内函数都在使用同一份闭包变量
def outer1(m):
    print("outer: m= ", m)
    def inner1(n):
        print("outer: n= ", n)
        return m+n
    return inner1

ot = outer1(10)
print(ot(20))
print(ot(30))
# outer: m=  10
# outer: n=  20
# 30
# outer: n=  30
# 40



"""
使用闭包的过程中,一旦外函数被调用了一次,返回了内函数的引用,虽然每次都很会调用内函数,会开启一个函数,执行后消亡
但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量
"""